package com.liu.jvm.classload;

/**
 * @author LIU
 * @version 1.0
 * @date 2024/6/6 9:29
 * @description ，Java类加载机制的核心：类加载器、类加载过程、双亲委派模型、自定义类加载器以及线程上下文类加载器，
 * 类加载器的任务是，根据一个类的全限定名读取它的二进制字节流数据，将其加载到内存转换成class对象
 *
 * 类加载器的关系
 *    Bootstrap引导类加载器
 *    Extension扩展类加载器
 *    Application系统类加载器
 *    User用户自定义加载器
 *
 * 类加载过程被分为三个步骤，五个阶段，分别为加载、连接（验证、准备、解析）以及初始化
 * JVM的类加载机制是按需加载的模式运行的，也就是代表着：所有类并不会在程序启动时全部加载，而是当需要用到某个类发现它未加载时，才会去触发加载的过程。
 */
public class ClassLoaderDemo extends ClassLoader {
    public static void main(String[] args) {
        ClassLoaderDemo classLoader = new ClassLoaderDemo();
        //com.liu.jvm.classload.ClassLoaderDemo
        System.out.println("自定义类加载器" +
                classLoader);

        //sun.misc.Launcher$AppClassLoader
        System.out.println("自定义类加载器的父类加载器" +
                classLoader.getParent());
        //sun.misc.Launcher$AppClassLoader
        System.out.println("Java程序默认的加载器" +
                ClassLoader.getSystemClassLoader());
        //sun.misc.Launcher$ExtClassLoader
        System.out.println("系统类加载器的付加载器" +
                ClassLoader.getSystemClassLoader().getParent());
        // null BootstrapClassLoader是由C++实现的，获取结果为null
        System.out.println("扩展类加载器的父加载器" +
                ClassLoader.getSystemClassLoader().getParent().getParent());


        /**
         * Java程序启动 → JVM初始化C++编写的Bootstrap启动类加载器 → Bootstrap加载Java核心类(核心类中包含Launcher类) →
         * Bootstrap加载Launcher类，其中触发Launcher构造函数 → Bootstrap执行Launcher构造函数的逻辑 →
         * Bootstrap初始化并创建Ext、App类加载器 → Launcher类的构造函数中将Ext设置为App的父类加载器 →
         * 同时再将App设置为默认的线程上下文类加载器
         * Thread.currentThread().setContextClassLoader(loader);
         */
        // sun.misc.Launcher$AppClassLoader
        System.out.println("线程上下文类加载器" +
                Thread.currentThread().getContextClassLoader());

    }
}
